package com.youlai.boot.modules.game.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.boot.core.security.util.SecurityUtils;
import com.youlai.boot.modules.game.mapper.GameUserRecordMapper;
import com.youlai.boot.modules.game.mapper.GameUserStatisticsMapper;
import com.youlai.boot.modules.game.model.entity.GameUserStatistics;
import com.youlai.boot.modules.game.model.vo.GameUserStatisticsVO;
import com.youlai.boot.modules.game.service.GameUserRecordService;
import com.youlai.boot.modules.game.service.GameUserStatisticsService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 游戏用户统计服务实现类
 *
 * @author 有来技术团队
 */
@Service
@RequiredArgsConstructor
public class GameUserStatisticsServiceImpl extends ServiceImpl<GameUserStatisticsMapper, GameUserStatistics> implements GameUserStatisticsService {

    private final GameUserRecordService gameUserRecordService;

    @Override
    public GameUserStatisticsVO getUserStatistics(Long userId) {
        // 如果未提供用户ID，则使用当前登录用户ID
        if (userId == null) {
            userId = SecurityUtils.getUserId();
        }
        
        // 查询用户统计信息
        GameUserStatistics userStatistics = this.getOne(
                new LambdaQueryWrapper<GameUserStatistics>()
                    .eq(GameUserStatistics::getUserId, userId)
        );
        
        // 如果不存在，则初始化
        if (userStatistics == null) {
            boolean initialized = this.initUserStatistics(userId);
            if (!initialized) {
                return new GameUserStatisticsVO();
            }
            
            userStatistics = this.getOne(
                    new LambdaQueryWrapper<GameUserStatistics>()
                        .eq(GameUserStatistics::getUserId, userId)
            );
            
            if (userStatistics == null) {
                return new GameUserStatisticsVO();
            }
        }
        
        // 转换为VO
        GameUserStatisticsVO vo = new GameUserStatisticsVO();
        BeanUtils.copyProperties(userStatistics, vo);
        
        // 设置用户基本信息（可以通过系统用户服务获取）
        // TODO: 这里暂时使用简单的数据，实际应该通过用户服务获取
        
        // 获取游戏类型分布
        vo.setGameTypeDistribution(gameUserRecordService.getGameTypeDistribution(userId));
        
        // 获取游戏进度列表
        vo.setGameProgressList(gameUserRecordService.getGameProgressList(userId, 5));
        
        // 获取每日游戏时长
        vo.setDailyPlayTime(this.getDailyPlayTime(userId));
        
        // 获取时段分布
        vo.setHourlyDistribution(this.getHourlyDistribution(userId));
        
        return vo;
    }

    @Override
    public boolean updateUserStatistics(Long userId) {
        // 如果未提供用户ID，则使用当前登录用户ID
        if (userId == null) {
            userId = SecurityUtils.getUserId();
        }
        
        // 检查用户统计信息是否存在
        long count = this.count(
                new LambdaQueryWrapper<GameUserStatistics>()
                    .eq(GameUserStatistics::getUserId, userId)
        );
        
        // 如果不存在，则先初始化
        if (count == 0) {
            return this.initUserStatistics(userId);
        }
        
        // 更新用户统计信息
        int rows = baseMapper.updateUserStatistics(userId);
        
        return rows > 0;
    }

    @Override
    public List<Map<String, Object>> getDailyPlayTime(Long userId) {
        // 如果未提供用户ID，则使用当前登录用户ID
        if (userId == null) {
            userId = SecurityUtils.getUserId();
        }
        
        // 查询近30天每日游戏时长
        return baseMapper.getDailyPlayTime(userId);
    }

    @Override
    public List<Map<String, Object>> getHourlyDistribution(Long userId) {
        // 如果未提供用户ID，则使用当前登录用户ID
        if (userId == null) {
            userId = SecurityUtils.getUserId();
        }
        
        // 查询游戏时段分布
        return baseMapper.getHourlyDistribution(userId);
    }

    @Override
    public boolean initUserStatistics(Long userId) {
        // 如果未提供用户ID，则使用当前登录用户ID
        if (userId == null) {
            userId = SecurityUtils.getUserId();
        }
        
        // 创建用户统计信息
        GameUserStatistics statistics = new GameUserStatistics();
        statistics.setUserId(userId);
        statistics.setTotalGames(0);
        statistics.setTotalPlayTime(0);
        statistics.setAchievementCount(0);
        statistics.setAverageRating(BigDecimal.ZERO);
        statistics.setLevel(1);
        statistics.setUpdateTime(LocalDateTime.now());
        
        // 保存用户统计信息
        boolean saved = this.save(statistics);
        
        // 更新统计信息
        if (saved) {
            return this.updateUserStatistics(userId);
        }
        
        return false;
    }
} 